package com.wzkun.aicraft.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.wzkun.aicraft.constant.AppConstant;
import com.wzkun.aicraft.exception.BusinessException;
import com.wzkun.aicraft.exception.ErrorCode;
import com.wzkun.aicraft.model.enums.CodeGenTypeEnum;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 抽象的代码文件保存器 —— 模板方法模式
 * @param <T> 请求参数类型
 *
 * @author wzk
 * @since 2025/11/13
 */
public abstract class CodeFileSaverTemplate<T> {

    /**
     * 文件保存的根目录
     */
//    private static final String FILE_SAVE_ROOT_DIR = System.getProperty("user.dir") + "/tmp/code_output";
    private static final String FILE_SAVE_ROOT_DIR = AppConstant.CODE_OUTPUT_ROOT_DIR;

    /**
     * 保存代码文件
     *
     * @param result 请求参数
     * @param appId  应用ID
     * @return 保存后的文件目录对象
     */
    public final File saveCode(T result,Long appId) {
        // 验证输入
        validateInput(result);
        // 构建唯一目录
        String baseDirPath = buildUniqueDir(appId);
        // 保存文件
        saveFiles(result, baseDirPath);
        // 返回文件目录对象
        return new File(baseDirPath);
    }

    /**
     * 验证输入参数
     * 子类可以自己实现
     */
    protected void validateInput(T result){
        if(result == null){
            throw new BusinessException(ErrorCode.SYSTEM_ERROR,"输入参数不能为空");
        }
    }

//    /**
//     * 构建文件的唯一路径（生成类型 + 雪花ID）tep/code_output/bizType_雪花ID
//     *
//     * @return 唯一路径
//     */
//    private String buildUniqueDir() {
//        String codeType = getCodeType().getValue();
//        String uniqueDirName = StrUtil.format("{}_{}", codeType, IdUtil.getSnowflakeNextIdStr());
//        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
//        FileUtil.mkdir(dirPath);
//        return dirPath;
//    }

    /**
     * 构建文件的唯一路径（生成类型 + 应用ID）tep/code_output/bizType_应用ID
     *
     * @param appId 应用id
     * @return 唯一路径
     */
    private String buildUniqueDir(Long appId) {
        if(appId == null){
            throw new BusinessException(ErrorCode.PARAMS_ERROR,"appId不能为空");
        }
        String codeType = getCodeType().getValue();
        String uniqueDirName = StrUtil.format("{}_{}", codeType, appId);
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
        FileUtil.mkdir(dirPath);
        return dirPath;
    }

    /**
     * 获取代码的类型
     *
     * @return CodeGenTypeEnum
     */
    protected abstract CodeGenTypeEnum getCodeType();

    /**
     * 保存文件 具体实现交给子类
     *
     * @param result 代码生成结果
     * @param baseDirPath 基础目录
     */
    protected abstract void saveFiles(T result, String baseDirPath);

    /**
     * 保存单个文件 通用方法
     *
     * @param dirPath 目录路径
     * @param filename 文件名
     * @param content 文件内容
     */
    public final void writeToFile(String dirPath, String filename, String content) {
        if(StrUtil.isNotBlank(content)){
            String filePath = dirPath + File.separator + filename;
            FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
        }
    }
}
